"""
2)应用蓝图
"""
from flask import flash, redirect, url_for, render_template, request, current_app
from flask_login import login_required, current_user

from app import db
from app.models import Todo, Category
from app.todo import todo
from app.todo.forms import AddTodoForm, EditTodoForm


# 查看任务
@todo.route('/list/')
@login_required
def list():
    form = AddTodoForm()  # 添加任务之前首先有一个表单，这里实例化了在forms文件中的表单类
    # 任务显示需要分页，每个用户只能查看自己的任务
    page=int(request.args.get('page',1))   # request获取用户传入的参数，由于页数是整型，所以int()
    todoPageobj=Todo.query.filter_by(
        user_id=current_user.id).paginate(
        # 在config.py文件中设置PER_PAGE=5
        # paginate设置分页，page表示显示几页，per_page表示显示多少条数据
        page,per_page=current_app.config['PER_PAGE']
    )
    return render_template('todo/list.html',todoObj=todoPageobj,form=form)


@todo.route('/add',methods=['POST'])
# 用get方法获取表单页面，post方法提交一些用户输入的新的数据
@login_required
def add():
    form = AddTodoForm()  # 添加任务之前首先有一个表单，这里实例化了在forms文件中的表单类
    if form.validate_on_submit():
        # 获取用户提交的内容
        content=form.content.data
        # 这里虽然填入的是字符串，但是实际存入的是任务id，是由于forms文件中coerce=int的设置
        category_id=form.category.data
        # 添加到数据库中
        todo=Todo(
            content=content,
            category_id=category_id,
            user_id=current_user.id
        )
        db.session.add(todo)
        db.session.commit()
        # 闪现信息没有显示，需要在add.html中include一下
        flash('添加任务成功',category='success')
        return redirect(url_for('todo.list'))
    print(Category.query.all())


@todo.route('/edit/<int:id>/',methods=['GET','POST'])
def edit(id):
    form=EditTodoForm()
    # ****重要**** 编辑任务时需要获取原先任务的信息，并显示到表单里面
    todo=Todo.query.filter_by(id=id).first()
    form.content.data=todo.content
    form.category.data=todo.category_id
    if form.validate_on_submit():
        # 更新时获取表单数据一定要使用request.form方法获取，
        # 而form.content.data并不能获取用户更新后提交的表单内容；
        content=request.form.get('content')
        category_id=request.form.get('category')
        # 更新到数据库里面
        todo.content=content
        todo.category_id=category_id
        db.session.add(todo)
        db.session.commit()
        flash('任务已更新',category='success')
        return redirect(url_for('todo.list'))
    return render_template('todo/edit.html',form=form)


# 删除任务，根据任务id删除
@todo.route('/delete/<int:id>')
@login_required
def delete(id):
    todo=Todo.query.filter_by(id=id).first()
    db.session.delete(todo)
    db.session.commit()
    flash('删除任务成功',category='success')
    return redirect(url_for('todo.list'))


# 修改任务状态为完成
@todo.route('/done/<int:id>')
@login_required
def done(id):
    todo=Todo.query.filter_by(id=id).first()
    todo.status=True
    db.session.add(todo)
    db.session.commit()
    flash('修改状态成功',category='success')
    return redirect(url_for('todo.list'))


# 修改任务状态为未完成
@todo.route('/undo/<int:id>')
@login_required
def undo(id):
    todo=Todo.query.filter_by(id=id).first()
    todo.status=False
    db.session.add(todo)
    db.session.commit()
    flash('修改状态成功',category='success')
    return redirect(url_for('todo.list'))